home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-06 / an112x.zip / ACCTRECS.C < prev    next >
C/C++ Source or Header  |  1991-11-13  |  9KB  |  238 lines

  1. #include <stdio.h>
  2. #include <ntt.h>
  3. #include <niterror.h>
  4. #include <nwbindry.h>
  5. #include <nwmisc.h>
  6. #include <string.h>
  7. #include <stdlib.h>
  8. #include <time.h>
  9. #include "acct.h"
  10.  
  11. #define PROG_NAME        "ACCTRECS"
  12. #define DEFAULT_DIR        "\\SYSTEM"
  13. #define DEFAULT_ACCT_FILE    "\\NET$ACCT.DAT"
  14. #define    MAX_BINDERY_OBJ_LEN    48
  15. #define COMMENT_OFFSET          26
  16.  
  17. void Usage(void);
  18. void ProcessRecord(ACCT_RECORD *recPtr);
  19. void DisplayDateAndServerClientIDs(ACCT_RECORD *record);
  20.  
  21. void main(int argc, char **argv)
  22. {
  23.     char    acctFilePath[MAX_DIR_ENTRY] = "";
  24.     char    *path;
  25.     char    *userName;
  26.     int    userSpecified = FALSE;
  27.     long    userID;
  28.     int    ccode;
  29.     FILE    *acctFile;
  30.     int    itemsRead;
  31.     ACCT_RECORD    *record;
  32.  
  33.     while (argc-- > 1) {
  34.         if ((argv[argc][0] == '/') && (argv[argc][1] == 'a')) {
  35.             /* found /a */
  36.             path = &argv[argc][2];
  37.             strcpy(acctFilePath, path);
  38.  
  39.         } else if ((argv[argc][0] == '/') && (argv[argc][1] == 'u')) {
  40.             /* found /u */
  41.             userName = &argv[argc][2];
  42.             ccode = GetBinderyObjectID(userName, OT_USER, &userID);
  43.             if (ccode != SUCCESSFUL) {
  44.                 printf("Unknown user: %s\n", userName);
  45.                 exit(1);
  46.             }
  47.             userSpecified = TRUE;
  48.  
  49.         } else {
  50.             /* unrecognized arg */
  51.             Usage();
  52.             exit(1);
  53.         }
  54.     }
  55.  
  56.     if (strlen(acctFilePath) == 0)
  57.         sprintf(acctFilePath, "%s%s", DEFAULT_DIR, DEFAULT_ACCT_FILE);
  58.  
  59.     acctFile = fopen(acctFilePath, "rb");
  60.     if (acctFile == NULL) {
  61.         printf("Unable to open %s\n", acctFilePath);
  62.         exit(1);
  63.     }
  64.  
  65.     do {
  66.         itemsRead = fread(record, sizeof(WORD), 1, acctFile);
  67.         if (itemsRead == 1) {
  68.             itemsRead = fread(&(record->serverID), IntSwap(record->length), 1, acctFile);
  69.             if (itemsRead != 1) {
  70.                 printf("Unexpected end of file %s\n", acctFilePath);
  71.                 break;
  72.             }
  73.             if (userSpecified) {
  74.                 if (LongSwap(record->clientID) == userID)
  75.                     ProcessRecord(record);
  76.             } else {
  77.                 ProcessRecord(record);
  78.             }
  79.         }
  80.     } while(itemsRead);
  81.     fclose(acctFile);
  82. }
  83.  
  84. void Usage(void)
  85. {
  86.     printf("Usage:\n\n");
  87.     printf("   %s [/aAcctFilePath] [/uUserName]\n\n", PROG_NAME);
  88.     printf("   /a     Specify accounting data file path\n");
  89.     printf("          Default accounting file is %s%s\n", DEFAULT_DIR, DEFAULT_ACCT_FILE);
  90.     printf("   /u     Display only accounting records pertaining to UserName\n");
  91.     printf("          Defaults to display data for all users\n\n");
  92. }
  93.  
  94. void ProcessRecord(ACCT_RECORD *record)
  95. {
  96.     int    i;
  97.     BYTE    *bytePtr;
  98.  
  99.     if (record->recordType == CHARGE_RECORD) {
  100.         switch (IntSwap(record->chargeOrNote.charge.chargeType)) {
  101.             case CONNECT_TIME_CHARGE_NOTE    :       DisplayDateAndServerClientIDs(record);
  102.                                 printf("\tConnect time charge:\n");
  103.                                 printf("\t\tCharge amount: %lu\n", LongSwap(record->chargeOrNote.charge.amount));
  104.                                 printf("\t\tCompletion code: ");
  105.                                 if (record->completionCode == SUCCESSFUL)
  106.                                     printf("SUCCESSFUL (%X)\n", SUCCESSFUL);
  107.                                 else if (record->completionCode == ACCT_CREDIT_LIMIT_EXCEEDED)
  108.                                     printf("ACCT_CREDIT_LIMIT_EXCEEDED (%X)\n", ACCT_CREDIT_LIMIT_EXCEEDED);
  109.                                 else if (record->completionCode == NO_ACCT_BALANCE)
  110.                                     printf("NO_ACCT_BALANCE (%X)\n", NO_ACCT_BALANCE);
  111.                                 else
  112.                                     printf("%X\n", record->completionCode);
  113.                                 printf("\t\tConnected %lu minutes\n",
  114.                                     LongSwap(record->chargeOrNote.charge.chargeComment.connectTimeCharge.connectTime));
  115.                                 printf("\t\tClient sent %lu request packets\n",
  116.                                     LongSwap(record->chargeOrNote.charge.chargeComment.connectTimeCharge.requestCount));
  117.                                 printf("\t\t%4.0X%4.0X%4Xh bytes read\n",
  118.                                     record->chargeOrNote.charge.chargeComment.connectTimeCharge.bytesReadHi,
  119.                                     record->chargeOrNote.charge.chargeComment.connectTimeCharge.bytesRead2,
  120.                                     record->chargeOrNote.charge.chargeComment.connectTimeCharge.bytesReadLo);
  121.                                 printf("\t\t%4.0X%4.0X%4Xh bytes written\n\n",
  122.                                     record->chargeOrNote.charge.chargeComment.connectTimeCharge.bytesWrittenHi,
  123.                                     record->chargeOrNote.charge.chargeComment.connectTimeCharge.bytesWritten2,
  124.                                     record->chargeOrNote.charge.chargeComment.connectTimeCharge.bytesWrittenLo);
  125.                                 break;
  126.  
  127.             case DISK_STORAGE_CHARGE_NOTE    :       DisplayDateAndServerClientIDs(record);
  128.                                 printf("\tDisk storage charge:\n");
  129.                                 printf("\t\tCharge amount: %lu\n", LongSwap(record->chargeOrNote.charge.amount));
  130.                                 printf("\t\tCompletion code: ");
  131.                                 if (record->completionCode == SUCCESSFUL)
  132.                                     printf("SUCCESSFUL (%X)\n", SUCCESSFUL);
  133.                                 else if (record->completionCode == ACCT_CREDIT_LIMIT_EXCEEDED)
  134.                                     printf("ACCT_CREDIT_LIMIT_EXCEEDED (%X)\n", ACCT_CREDIT_LIMIT_EXCEEDED);
  135.                                 else
  136.                                     printf("%X\n", record->completionCode);
  137.                                 printf("\t\tNumber of disk blocks owned: %ld\n",
  138.                                     LongSwap(record->chargeOrNote.charge.chargeComment.diskStorageTimeCharge.blocksOwned));
  139.                                 printf("\t\tFor %ld half hours.\n\n",
  140.                                     LongSwap(record->chargeOrNote.charge.chargeComment.diskStorageTimeCharge.numberOfHalfHours));
  141.                                 break;
  142.  
  143.             default    :                               DisplayDateAndServerClientIDs(record);
  144.                                 printf("\tUnknown charge record:\n");
  145.                                 printf("\t\tCharge amount: %lu\n", LongSwap(record->chargeOrNote.charge.amount));
  146.                                 printf("\t\tCompletion code: ");
  147.                                 if (record->completionCode == SUCCESSFUL)
  148.                                     printf("SUCCESSFUL (%X)\n", SUCCESSFUL);
  149.                                 else if (record->completionCode == ACCT_CREDIT_LIMIT_EXCEEDED)
  150.                                     printf("ACCT_CREDIT_LIMIT_EXCEEDED (%X)\n", ACCT_CREDIT_LIMIT_EXCEEDED);
  151.                                 else
  152.                                     printf("%X\n", record->completionCode);
  153.                                 printf("\t\tComment: ");
  154.                                 bytePtr = &(record->chargeOrNote.charge.chargeComment.unknownCharge.comment);
  155.                                 for (i=0; i<(record->length - COMMENT_OFFSET); i++)
  156.                                     printf("%X", *bytePtr++);
  157.                                 printf("\n\n");
  158.                                 break;
  159.         }
  160.  
  161.     } else if (record->recordType == NOTE_RECORD) {
  162.         switch (IntSwap(record->chargeOrNote.note.noteType)) {
  163.             case LOGIN_NOTE            :       DisplayDateAndServerClientIDs(record);
  164.                                 printf("\tLogin note:\n");
  165.                                 printf("\t\t Net: %lX\n",
  166.                                     LongSwap(record->chargeOrNote.note.noteComment.loginNote.net));
  167.                                 printf("\t\tNode: %lX%X\n\n",
  168.                                     LongSwap(record->chargeOrNote.note.noteComment.loginNote.nodeHigh),
  169.                                     IntSwap(record->chargeOrNote.note.noteComment.loginNote.nodeLow));
  170.                                 break;
  171.  
  172.             case LOGOUT_NOTE        :       DisplayDateAndServerClientIDs(record);
  173.                                 printf("\tLogout note:\n");
  174.                                 printf("\t\t Net: %lX\n",
  175.                                     LongSwap(record->chargeOrNote.note.noteComment.loginNote.net));
  176.                                 printf("\t\tNode: %lX%X\n\n",
  177.                                     LongSwap(record->chargeOrNote.note.noteComment.loginNote.nodeHigh),
  178.                                     IntSwap(record->chargeOrNote.note.noteComment.loginNote.nodeLow));
  179.                                 break;
  180.  
  181.             case ACCOUNT_LOCKED_NOTE    :       DisplayDateAndServerClientIDs(record);
  182.                                 printf("\tAccount locked note:\n");
  183.                                 printf("\t\t Net: %lX\n",
  184.                                     LongSwap(record->chargeOrNote.note.noteComment.loginNote.net));
  185.                                 printf("\t\tNode: %lX%X\n\n",
  186.                                     LongSwap(record->chargeOrNote.note.noteComment.loginNote.nodeHigh),
  187.                                     IntSwap(record->chargeOrNote.note.noteComment.loginNote.nodeLow));
  188.                                 break;
  189.  
  190.             case SERVER_TIME_MODIFIED_NOTE    :       DisplayDateAndServerClientIDs(record);
  191.                                 printf("\tServer time modified note:\n");
  192.                                 printf("\t\tNew time: %02d:%02d:%02d %02d/%02d/%02d\n\n",
  193.                                     record->chargeOrNote.note.noteComment.serverTimeNote.hour,
  194.                                     record->chargeOrNote.note.noteComment.serverTimeNote.minute,
  195.                                     record->chargeOrNote.note.noteComment.serverTimeNote.second,
  196.                                     record->chargeOrNote.note.noteComment.serverTimeNote.month,
  197.                                     record->chargeOrNote.note.noteComment.serverTimeNote.day,
  198.                                     record->chargeOrNote.note.noteComment.serverTimeNote.year);
  199.                                 break;
  200.  
  201.             default    :                               DisplayDateAndServerClientIDs(record);
  202.                                 printf("\tUnknown note record:\n");
  203.                                 printf("\t\tComment: ");
  204.                                 bytePtr = &(record->chargeOrNote.note.noteComment.unknownNote.comment);
  205.                                 for (i=0; i<(record->length - COMMENT_OFFSET); i++)
  206.                                     printf("%X", *bytePtr++);
  207.                                 printf("\n\n");
  208.                                 break;
  209.         }
  210.  
  211.     } else {
  212.         DisplayDateAndServerClientIDs(record);
  213.         printf("\tUnknown record type: %d\n\n", record->recordType);
  214.     }
  215. }
  216.  
  217. void DisplayDateAndServerClientIDs(ACCT_RECORD *record)
  218. {
  219.     int    ccode;
  220.     char    objectName[MAX_BINDERY_OBJ_LEN];
  221.  
  222.     /* print date and time record was submitted */
  223.     printf("%02d:%02d:%02d %02d/%02d/%02d\n", record->timeStamp[3], record->timeStamp[4],
  224.                         record->timeStamp[5], record->timeStamp[1],
  225.                         record->timeStamp[2], record->timeStamp[0]);
  226.  
  227.     /* print server name and ID */
  228.     ccode = GetBinderyObjectName(LongSwap(record->serverID), objectName, (WORD *)NULL);
  229.     if (ccode)
  230.         strcpy(objectName, "(unknown server)");
  231.     printf("\tServer name (ID): %s (%lX)\n", objectName, LongSwap(record->serverID));
  232.  
  233.     /* print client name and ID */
  234.     ccode = GetBinderyObjectName(LongSwap(record->clientID), objectName, (WORD *)NULL);
  235.     if (ccode)
  236.         strcpy(objectName, "(unknown user)");
  237.     printf("\tClient name (ID): %s (%lX)\n", objectName, LongSwap(record->clientID));
  238. }